<!DOCTYPE html>
<html lang="zh-CN">


<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/alwaysblog/favicon_1.ico">
  <link rel="icon" type="image/png" href="/alwaysblog/favicon_1.ico">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="author" content="张小剩">
  
    <meta name="description" content="折腾是一种乐趣，求知是一种追求！">
  
  
    <meta name="keywords" content="软件测试," />
  
  <meta http-equiv="Cache-Control" content="no-transform" />
  <meta http-equiv="Cache-Control" content="no-siteapp" />
  <title>软件测试面试 - 张小剩的博客</title>
  <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/5.10.0/css/all.min.css"  >
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css"  >
<link rel="stylesheet" href="https://cdn.staticfile.org/mdbootstrap/4.8.7/css/mdb.min.css"  >
<link rel="stylesheet" href="https://cdn.staticfile.org/github-markdown-css/3.0.1/github-markdown.min.css"  >

<link rel="stylesheet" href="//at.alicdn.com/t/font_1067060_qzomjdt8bmp.css">


  <link rel="stylesheet" href="/alwaysblog/lib/prettify/tranquil-heart.min.css"  >


  <link rel="stylesheet" href="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.css"  >

<link rel="stylesheet" href="/alwaysblog/css/main.css"  >
<script src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js" ></script>
  <style type="text/css">
    .banner-bg {
      
        background-image: url('/alwaysblog/static/images/wallhaven-8opx8k.jpg');
      
      background-position: center;
      background-repeat: repeat-y;
      background-size: cover;
      background-attachment: fixed;
    }
  </style>
<meta name="generator" content="Hexo 5.4.1"><link rel="alternate" href="/alwaysblog/atom.xml" title="张小剩的博客" type="application/atom+xml">
</head>

<body class="banner-bg">
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/alwaysblog/">&nbsp;<strong>张小剩的博客</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
          <li class="nav-item">
            <a class="nav-link" href="/alwaysblog/">主页</a>
          </li>
        
          
          
          
          
          <li class="nav-item">
            <a class="nav-link" href="/alwaysblog/archives/">归档</a>
          </li>
        
          
          
          
          
          <li class="nav-item">
            <a class="nav-link" href="/alwaysblog/categories/">分类</a>
          </li>
        
          
          
          
          
          <li class="nav-item">
            <a class="nav-link" href="/alwaysblog/tags/">标签</a>
          </li>
        
          
          
          
          
          <li class="nav-item">
            <a class="nav-link" href="/alwaysblog/links/">友链</a>
          </li>
        
          
          
          
          
          <li class="nav-item">
            <a class="nav-link" href="/alwaysblog/about/">关于</a>
          </li>
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" data-toggle="modal" data-target="#modalSearch">&nbsp;&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>


</nav>

    <div class="view intro-2 rgba-black-slight" id="background">
      <div class="full-bg-img">
        <div class="mask flex-center">
          <div class="container text-center white-text fadeInUp">
            <span class="h2" id="subtitle">
              
            </span>
            
              <br>
              <p class="mt-3">
                <i class="far fa-calendar-alt"></i>
                <span class="post-date">2020-05-27&nbsp;|&nbsp;</span>
                <i class="far fa-chart-bar"></i>
                <span class="post-count">5.1k</span>字&nbsp;|&nbsp;
                <i class="far fa-clock"></i>
                <span class="post-count">17</span>分钟
                
              </p>
            
          </div>
          
        </div>
      </div>
    </div>
  </header>
  <main id="mainContent" class="rgba-black-slight">
    
      
<meta name="referrer" content="no-referrer" />

<div class="container-fluid">
  <div class="row">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-md">
      <div class="py-5 z-depth-3" id="board">
        <div class="post-content mx-auto" id="post">
          <div class="markdown-body">
            <h2 id="软件测试方法的分类"><a href="#软件测试方法的分类" class="headerlink" title="软件测试方法的分类"></a>软件测试方法的分类</h2><div align="center">

<p><img src="https://i.loli.net/2020/05/28/PcGbk4dYFfXLTzj.png" srcset="undefined" alt="软件测试分类.png"></p>
</div>

<h2 id="常用测试方法"><a href="#常用测试方法" class="headerlink" title="常用测试方法"></a>常用测试方法</h2><div align="center">

<p><img src="https://i.loli.net/2020/05/28/seV7fQw169kG5dh.png" srcset="undefined" alt="测试方法.png"></p>
</div>

<h2 id="系统测试方法"><a href="#系统测试方法" class="headerlink" title="系统测试方法"></a>系统测试方法</h2><div align="center">

<p><img src="https://i.loli.net/2020/05/28/7uieAb1MB3VH8ZR.png" srcset="undefined" alt="系统测试.png"></p>
</div>

<h2 id="什么是软件测试"><a href="#什么是软件测试" class="headerlink" title="什么是软件测试"></a>什么是软件测试</h2><ul>
<li>软件测试是利⽤测试⼯具按照测试⽅法和流程对开发出来的产品进⾏功能、性能、安全等的测试。满⾜产品需求。</li>
</ul>
<h2 id="软件产品质量模型（ISO-IEC-9126）"><a href="#软件产品质量模型（ISO-IEC-9126）" class="headerlink" title="软件产品质量模型（ISO / IEC 9126）"></a>软件产品质量模型（ISO / IEC 9126）</h2><ul>
<li>功能性：提供满足明确和隐含要求的功能的能力</li>
<li>可靠性：在特定条件下使用时，软件产品呢维持规定的性能级别能力<ul>
<li>设备最好不要出故障</li>
<li>设备出故障了，不要影响主要的功能和业务</li>
<li>如果影响了主要功能和业务，系统可以尽快定位并恢复</li>
</ul>
</li>
<li>易用性：易懂、易学、易用、漂亮好看（用户体验好）</li>
<li>效率：软件产品可提供适当的性能的能力，也就是产品的性能（单选、多选、全选）</li>
<li>可维护性：产品可以被修改的能力。可以增加功能，可以更新。</li>
<li>可移植性：跨越不同系统平台</li>
</ul>
<h3 id="对一支笔从软件质量的体系进行分析要测哪些？"><a href="#对一支笔从软件质量的体系进行分析要测哪些？" class="headerlink" title="对一支笔从软件质量的体系进行分析要测哪些？"></a>对一支笔从软件质量的体系进行分析要测哪些？</h3><ul>
<li>功能： 是否可以写出字，字的颜色，字的粗细，笔的重量，笔的材质，笔的尺寸</li>
<li>性能： 一支笔能连续写多久，从高处掉落会不会坏</li>
<li>易用性： 是否美观，是否好握，书写是否舒服</li>
<li>安全： 材质是否符合安全规范，是否对人体产生危害</li>
<li>可移植性： 是否可以通过换笔芯继续使用。</li>
</ul>
<h2 id="Web-测试与-App-测试"><a href="#Web-测试与-App-测试" class="headerlink" title="Web 测试与 App 测试"></a>Web 测试与 App 测试</h2><h3 id="软件测试流程"><a href="#软件测试流程" class="headerlink" title="软件测试流程"></a>软件测试流程</h3><p>我们会先进行需求评审，根据需求并书写测试用例，然后和其他测试人员交换用例，以达到用例评审的目的，修改遗漏和错误的测试用例，等待开发提测，如果期间接口设计完成，我们会先对接口进行测试，开发提测以后，根据测试用例对项目进行测试，如果出现 Bug，会将Bug 提交给对应开发人员，开发人员修复以后，需要对 Bug 再次进行测试，如果涉及到其他功能，也需要对它们进行测试，如果还是有问题，继续提交给对应开发人员，直到整个项目测试完成。另外在项目上线前，需要对项目的重要功能进行测试，确保项目可以正常上线，上线后，对重要功能再次进行测试确保用户可以正常使用，同时也需要持续关注项目的各个功能是否正常。</p>
<h3 id="App-测试流程"><a href="#App-测试流程" class="headerlink" title="App 测试流程"></a>App 测试流程</h3><p>我们会先进行需求评审，然后根据需求书写测试用例，然后和其他测试人员交换用例，以达到用例评审的目的，修改遗漏和错误的测试用例，等待开发提测，开发提测后，我们会先进行冒烟测试，看一下项目的主流程是否可以走通，然后进行功能测试和接口测试，完成以后，对 App 的安装卸载进行测试包括 App 的覆盖安装和升级，再然后会对 App 在断网和弱网的环境下进行测试，最后对 App 的兼容性进行测试，全部测完以后对整个项目进行回归测试，以便项目可以正常上线。上线后，对重要功能再次进行测试确保用户可以正常使用，同时也需要持续关注项目的各个功能是否正常。</p>
<h3 id="Web-测试与-App-测试的区别"><a href="#Web-测试与-App-测试的区别" class="headerlink" title="Web 测试与 App 测试的区别"></a>Web 测试与 App 测试的区别</h3><ul>
<li><p>从功能测试的层面上来讲的话，App 测试、Web 测试 在流程和功能测试上是没有区别的。</p>
</li>
<li><p>系统架构方面：</p>
<ul>
<li>Web 项目，一般都是 b/s 架构，基于浏览器的</li>
<li>App 项目，则是 c/s 的，必须要有客户端，用户需要安装客户端。</li>
<li>Web 测试只要更新了服务器端，客户端就会同步会更新。App 项目则需要客户端和服务器都更新。</li>
</ul>
</li>
<li><p>性能方面:</p>
<ul>
<li>Web 页面主要会关注响应时间</li>
<li>而 App 则还需要关心流量、电量、CPU、GPU、Memory 这些。</li>
<li>它们服务端的性能没区别，都是一台服务器。</li>
</ul>
</li>
<li><p>兼容方面：</p>
<ul>
<li>Web 是基于浏览器的，所以更倾向于浏览器和电脑硬件，电脑系统的方向的兼容 ，所以 Web 测试不必考虑安装卸载</li>
<li>App 测试是基于客户端的，则要看分辨率，屏幕尺寸，还要看设备系统。</li>
</ul>
</li>
</ul>
<p>所以 App 测试则必须测试安装、更新、卸载。除了常规的安装、更新、卸载还要考虑到异常场景。包括安装时的中断、弱网、安装后删除安装文件<br>此外 App 还有一些专项测试：如网络、适配性。。。</p>
<h3 id="App-测试特点"><a href="#App-测试特点" class="headerlink" title="App 测试特点"></a>App 测试特点</h3><p><strong>（除了按需求说明书外的 功能测试 之外还需要进行如下测试）</strong></p>
<ul>
<li>适配性测试（也叫兼容性测试，不同的安卓版本，不同厂商，不同手机品牌）</li>
<li>不同网络测试 （2G 网络/3G 网络/4G 网络/WIFI 网络）</li>
<li>在线升级测试</li>
<li>中断测试（电话、短中消息打扰）</li>
<li>耗电量测试</li>
<li>弱网测试（信号差，信号屏蔽实验室）</li>
<li>安装卸载 （C/S）</li>
<li>流量测试</li>
</ul>
<h2 id="系统测试是什么，有哪些测试方法。流程是什么"><a href="#系统测试是什么，有哪些测试方法。流程是什么" class="headerlink" title="系统测试是什么，有哪些测试方法。流程是什么?"></a>系统测试是什么，有哪些测试方法。流程是什么?</h2><p>[ 系统测试 ]</p>
<ul>
<li>对项目进行全面的测试，其中包含单元测试和集成测试</li>
</ul>
<p>[ 测试方法 ]</p>
<ul>
<li>功能测试</li>
<li>异常测试</li>
<li>性能测试</li>
<li>易用性测试</li>
<li>安全性测试</li>
<li>GUI 测试</li>
<li>兼容性测试</li>
<li>配置测试</li>
<li>安装测试</li>
</ul>
<p>[ 流程 ]</p>
<p>我们拿到需求以后，根据需求书写测试用例，然后和其他测试人员交换用例，以达到用例评审，然后修改遗漏和错误的测试用例，等待开发完成，然后测试项目，如果出现 Bug， Bug 用工具指向开发人员，开发人员修改后，对 Bug 进行测试，并对其关联的模块进行测试，如果没有问题继续测试，如果还有问题，继续指向开发人修改，如此往复直到么有问题为止。</p>
<h2 id="测试用例的设计方法"><a href="#测试用例的设计方法" class="headerlink" title="测试用例的设计方法"></a>测试用例的设计方法</h2><ul>
<li>等价类划分法</li>
<li>边界值分析法</li>
<li>因果图/判定表法</li>
<li>错误推断法</li>
<li>正交实验法</li>
<li>场景设计法/流程分析法</li>
</ul>
<h2 id="http-协议-和-https-协议"><a href="#http-协议-和-https-协议" class="headerlink" title="http 协议 和 https 协议"></a>http 协议 和 https 协议</h2><h3 id="http-协议"><a href="#http-协议" class="headerlink" title="http 协议"></a>http 协议</h3><ul>
<li>HTTP 协议： 超文本传输协议</li>
</ul>
<p>[ 请求方式 ]</p>
<ul>
<li>GET</li>
<li>POST</li>
<li>PUT</li>
<li>DELETE</li>
</ul>
<p>[ 状态码 ]</p>
<ul>
<li>200 成功</li>
<li>204 请求成功，服务端没有内容</li>
<li>301 永久重定向</li>
<li>302 临时重定向</li>
<li>304 走缓存</li>
<li>400 参数错误</li>
<li>401 权限不够</li>
<li>403 服务器拒绝响应</li>
<li>404 资源不存在</li>
<li>500 服务器端错误，</li>
<li>502 网关错误</li>
</ul>
<h3 id="http-协议-和-https-协议的区别"><a href="#http-协议-和-https-协议的区别" class="headerlink" title="http 协议 和 https 协议的区别"></a>http 协议 和 https 协议的区别</h3><ul>
<li>http 协议是超文本传输协议，信息是明文传输</li>
<li>https 是具有安全性的 ssl / tls 加密传输协议</li>
<li>http 和 https 使用的是完全不同的连接方式，用的端口也不一样，前者是 80，后者是 443</li>
<li>http 的连接很简单，是无状态的; HTTPS 协议是由 SSL/TLS+HTTP 协议构建的可进行加密传输、身份认证的网络协议，比 http 协议安全</li>
</ul>
<h3 id="TCP与UDP的区别"><a href="#TCP与UDP的区别" class="headerlink" title="TCP与UDP的区别"></a>TCP与UDP的区别</h3><p>TCP（Transmission Control Protocol，传输控制协议）<br>UDP（User Data Protocol，用户数据报协议）</p>
<p>1、基于连接与无连接；</p>
<p>2、对系统资源的要求（TCP较多，UDP少）；</p>
<p>3、UDP程序结构较简单；</p>
<p>4、流模式与数据报模式 ；</p>
<p>5、TCP保证数据正确性，UDP可能丢包；</p>
<p>6、TCP保证数据顺序，UDP不保证。</p>
<h2 id="接口测试流程"><a href="#接口测试流程" class="headerlink" title="接口测试流程"></a>接口测试流程</h2><ul>
<li>接口的功能测试（先保证接口是正确的）</li>
<li>测试接口的数据（传递一些特殊的数据，保证接口没有问题）</li>
<li>自动化测试脚本的编辑</li>
<li>接口的性能、压力测试</li>
</ul>
<blockquote>
<ul>
<li>HTTP: 超文本传输协议，浏览器和服务器之间通信的规则</li>
<li>URL: 统一资源定位符，协议://主机地址/路径</li>
<li>GET: 提交的数据显示在地址栏，不安全，提交的数据量有限制，不重要的数据使用 GET</li>
<li>POST: 隐式提交数据，更安全，没有数据量大小的限制，重要数据使用 POST</li>
</ul>
</blockquote>
<h3 id="Fiddler-的原理"><a href="#Fiddler-的原理" class="headerlink" title="Fiddler 的原理"></a>Fiddler 的原理</h3><ul>
<li>Fiddler 是位于客户端和服务器端的 HTTP 代理，能够记录客户端和服务器之间的所有 HTTP 请求，可以针对特定的 HTTP 请求，分析或修改请求数据，也可以修改服务器返回的数据。</li>
</ul>
<h3 id="你可以说说-jmeter-里的进程和线程吗？"><a href="#你可以说说-jmeter-里的进程和线程吗？" class="headerlink" title="你可以说说 jmeter 里的进程和线程吗？"></a>你可以说说 jmeter 里的进程和线程吗？</h3><h3 id="你说说聚合报告是个什么东西？"><a href="#你说说聚合报告是个什么东西？" class="headerlink" title="你说说聚合报告是个什么东西？"></a>你说说聚合报告是个什么东西？</h3><ul>
<li>对于每个请求，它统计响应信息并提供请求数，平均值，最大，最小值，错误率，大约吞吐量(以请求数/秒为单位)和以kb/秒为单位的吞吐量.</li>
</ul>
<h2 id="缺陷（Bug）管理"><a href="#缺陷（Bug）管理" class="headerlink" title="缺陷（Bug）管理"></a>缺陷（Bug）管理</h2><h3 id="一个“缺陷”的记录都包含哪些内容"><a href="#一个“缺陷”的记录都包含哪些内容" class="headerlink" title="一个“缺陷”的记录都包含哪些内容"></a>一个“缺陷”的记录都包含哪些内容</h3><ul>
<li>所属产品、模块、项目、版本</li>
<li>Bug 指派</li>
<li>Bug 标题</li>
<li>优先级</li>
<li>严重程度</li>
<li>操作步骤</li>
<li>实际结果</li>
<li>预期结果</li>
</ul>
<h3 id="怎么区分-Bug-是前端的还是后端的"><a href="#怎么区分-Bug-是前端的还是后端的" class="headerlink" title="怎么区分 Bug 是前端的还是后端的"></a>怎么区分 Bug 是前端的还是后端的</h3><ol>
<li>如果项目崩溃，就是前端的 Bug</li>
<li>界面出现问题，前端 Bug</li>
<li>资源不能加载（根据状态码）</li>
</ol>
<ul>
<li>500： 后端的问题</li>
<li>404：</li>
<li><ul>
<li>查看前端有没有发出去请求</li>
<li>查看前端请求接口是不是对的</li>
<li>查看前端请求参数是否正确</li>
</ul>
</li>
<li>200：<ul>
<li>后端返回的数据是否正确</li>
<li>前端读取数据的时候出错 </li>
</ul>
</li>
</ul>
<h3 id="优先级与严重程度"><a href="#优先级与严重程度" class="headerlink" title="优先级与严重程度"></a>优先级与严重程度</h3><h4 id="Bug-优先级（Bug-修复的先后顺序，针对于测试人员）"><a href="#Bug-优先级（Bug-修复的先后顺序，针对于测试人员）" class="headerlink" title="Bug 优先级（Bug 修复的先后顺序，针对于测试人员）"></a>Bug 优先级（Bug 修复的先后顺序，针对于测试人员）</h4><ul>
<li>一级： 严重影响到后面功能模块的测试工作</li>
<li>二级： Bug 会制约开发和测试的活动进行，需要在发布前修复</li>
<li>三级： 不影响其他工作，文字，话术、图片等出现错误</li>
</ul>
<h4 id="Bug-严重程度（从用户角度考虑）"><a href="#Bug-严重程度（从用户角度考虑）" class="headerlink" title="Bug 严重程度（从用户角度考虑）"></a>Bug 严重程度（从用户角度考虑）</h4><ul>
<li>一级：致命问题，App 崩溃</li>
<li>二级：功能出现错误，</li>
<li>三级：UI 界面出现错误（文字，话术、图片等）</li>
</ul>
<h4 id="测试用例优先级"><a href="#测试用例优先级" class="headerlink" title="测试用例优先级"></a>测试用例优先级</h4><ul>
<li>一级：正向的流程，主功能</li>
<li>二级：反向的流程</li>
<li>三级：检查 UI 界面的文本、图片等</li>
</ul>
<h2 id="冒烟测试和回归测试的区别"><a href="#冒烟测试和回归测试的区别" class="headerlink" title="冒烟测试和回归测试的区别"></a>冒烟测试和回归测试的区别</h2><ul>
<li>测试目的不同<ul>
<li>冒烟测试：用于确认代码中的更改会按预期运行，且不会破坏整个版本的稳定性。</li>
<li>回归测试：以确认修改没有引入新的错误或导致其他代码产生错误。</li>
</ul>
</li>
<li>测试过程不同<ul>
<li>冒烟测试：是在将代码更改嵌入到产品的源树中之前对这些更改进行验证的过程。</li>
<li>回归测试：是指漏洞由开发人员修改之后再次测试的过程。</li>
</ul>
</li>
<li>问题解决方式不同<ul>
<li>冒烟测试：冒烟测试中是发现问题然后反馈给开发人员进行修改。</li>
<li>回归测试：回归测试是修改完之后进行验证再进行的工程。</li>
</ul>
</li>
<li>测试周期不同<ul>
<li>冒烟测试：冒烟测试只集中考虑了一开始的那个问题，而忽略其它的问题，这就可能引起了新的 Bug，SmokeTest 优点是节省测试时间。</li>
<li>回归测试：回归测试作为软件生命周期的一个组成部分，在整个软件测试过程中占有很大的工作量比重，软件开发的各个阶段都会进行多次回归测试。</li>
</ul>
</li>
<li>测试意义不同<ul>
<li>冒烟测试：冒烟测试是对软件质量的总体检验，是测试人员对测试流程的熟悉，是软件测试过程中一个不可或缺的节点，一个好的冒烟测试过程，对于软件测试效率的提升具有重要意义。</li>
<li>回归测试：回归测试是软件测试中的一个十分重要且成本昂贵的过程。对针对如何减少回归测试成本，提高回归测试效率的研究将具有十分重要的意义。</li>
</ul>
</li>
</ul>
<h2 id="git-是干嘛的？git-和-svn-有什么区别？"><a href="#git-是干嘛的？git-和-svn-有什么区别？" class="headerlink" title="git 是干嘛的？git 和 svn 有什么区别？"></a>git 是干嘛的？git 和 svn 有什么区别？</h2><ul>
<li>git 是分布式版本控制系统，SVN 是集中式版本控制系统，这两个都是管理代码的</li>
<li>svn 严重的依赖服务器端，当服务器端无法使用的时候，版本控制也就无法再使用了。</li>
<li>git 当这个系统的任何一个客户端出现问题的时候，都可以从另外的客户端（即使服务器挂了）获取所有的代码。</li>
</ul>
<h2 id="说一下-cookies-和-session，token。服务器是怎么知道你这个登录的用户是哪个用户？"><a href="#说一下-cookies-和-session，token。服务器是怎么知道你这个登录的用户是哪个用户？" class="headerlink" title="说一下 cookies 和 session，token。服务器是怎么知道你这个登录的用户是哪个用户？"></a>说一下 cookies 和 session，token。服务器是怎么知道你这个登录的用户是哪个用户？</h2><ul>
<li>cookie 和 session 都是用来存储数据的，cookie 的数据存储在浏览器，session 的数据存储在服务器端，用户请求，服务器端生成 session 并返回 sessionid 给客户端，客户端把 sessionid 存储在 cookie 中，以后请求都会带上 sessionid</li>
<li>token 和 session 算是一类，都是用于服务器验证的。</li>
<li>服务器会通过用户请求携带的 sessionid 来识别用户</li>
</ul>
<h2 id="敏捷开发的特点"><a href="#敏捷开发的特点" class="headerlink" title="敏捷开发的特点"></a>敏捷开发的特点</h2><p>敏捷开发多用于小的团队，以用户为核心，利用短迭代方法来交付软件，开发的过程中更注重的是人员的交流。</p>
<h2 id="Selenium-中-等待方式有哪些，区别是什么？"><a href="#Selenium-中-等待方式有哪些，区别是什么？" class="headerlink" title="Selenium 中,等待方式有哪些，区别是什么？"></a>Selenium 中,等待方式有哪些，区别是什么？</h2><ul>
<li>sleep 休眠方法</li>
<li>隐式等待，driver.implicitly_wait(10) 隐性等待，最长等 10 秒</li>
<li>显示等待，WebDriverWait() 它是由 Webdirver 提供的等待方法</li>
</ul>
<h2 id="功能测试在-beta-版本对外上线的标准是什么"><a href="#功能测试在-beta-版本对外上线的标准是什么" class="headerlink" title="功能测试在 beta 版本对外上线的标准是什么"></a>功能测试在 beta 版本对外上线的标准是什么</h2><ul>
<li>测试用例全部跑完，并且 Bug 都已经关闭，然后业务验收后可以上线。</li>
</ul>
<h2 id="软件测试结束的标准"><a href="#软件测试结束的标准" class="headerlink" title="软件测试结束的标准"></a>软件测试结束的标准</h2><ul>
<li>测试用例全部跑完，并且 Bug 都已经关闭</li>
<li>性能指标达到要求</li>
<li>验收测试通过</li>
</ul>
<h2 id="有没有用过-django-框架？"><a href="#有没有用过-django-框架？" class="headerlink" title="有没有用过 django 框架？"></a>有没有用过 django 框架？</h2><h2 id="你知道深拷贝和浅拷贝的区别吗？"><a href="#你知道深拷贝和浅拷贝的区别吗？" class="headerlink" title="你知道深拷贝和浅拷贝的区别吗？"></a>你知道深拷贝和浅拷贝的区别吗？</h2><p>如果拷贝的对象里的元素只有值，没有引用，那浅拷贝和深拷贝没有差别，如果拷贝的对象里的元素包含引用，浅拷贝保存的是引用地址，对新对象里的引用里的值进行修改，依然会改变原对象里的列表的值。而深拷贝则不同，它会将原对象里的引用也新创建一个。</p>
<h2 id="一个测试需要具备什么素质？"><a href="#一个测试需要具备什么素质？" class="headerlink" title="一个测试需要具备什么素质？"></a>一个测试需要具备什么素质？</h2><ul>
<li>五心（细心，专心，耐心，信心，责任心）</li>
<li>要相信任何软件都存在缺陷</li>
<li>需要具备专业的软件测试技能</li>
<li>具备一定的逻辑分析能力</li>
<li>具备团队合作精神</li>
<li>具备较好的沟通能力</li>
<li>实事求是</li>
<li>具备较好的学习能力</li>
<li>具备一定的编程能力</li>
<li>要有原则</li>
<li>不断总结经验与教训</li>
<li>无论缺陷大小都要上报</li>
<li>遇到不可重现的bug也要报告</li>
</ul>
<h3 id="保持怀疑"><a href="#保持怀疑" class="headerlink" title="保持怀疑"></a>保持怀疑</h3><p>对产品的质量持有一颗敢于怀疑的心，质量不是开发人员说”我做完了而且也测过了”就可以保证的。直到你测完最后一轮，最后一个用例之前，你都应该对产品的质量持怀疑态度。这个态度是混口饭吃的最基本技能。</p>
<h3 id="永不妥协"><a href="#永不妥协" class="headerlink" title="永不妥协"></a>永不妥协</h3><p>不要对产品质量妥协，哪怕开发口口声声说这个问题不好改，改不了，一改就要延期之类的话。妥协意味着你成功的把质量不好这口黑锅华丽的背在了自己的身上。</p>
<h3 id="让用户满意"><a href="#让用户满意" class="headerlink" title="让用户满意"></a>让用户满意</h3><p>产品或项目成功的标志之一是能够让用户满意，很显然用户是不会对一个bug频出的系统／产品满意的。</p>
<h3 id="从用户角度思考"><a href="#从用户角度思考" class="headerlink" title="从用户角度思考"></a>从用户角度思考</h3><p>很多测试同学不知道测试用例应该怎么去写，不知道怎么写才能写得出比较健全的用例。当你在苦恼用例从哪里来的时候，不妨试试下面两个办法从用户角度去思考，如果你是一个特定的用户（年龄，身份，职业）你应该会怎么使用这个产品从场景的角度去思考，在哪些场景下会使用到这个产品写不出用例可能就意味着你对产品的功能不够熟悉，不如让熟悉这个产品的同事给你介绍一下主要功能</p>
<h3 id="分清主次"><a href="#分清主次" class="headerlink" title="分清主次"></a>分清主次</h3><p>要分清楚任务的优先级，优先级高的先做，依此类推。在没有分清优先级的情况下不要盲目的开始测试。</p>
<h3 id="从不承诺100-的覆盖率"><a href="#从不承诺100-的覆盖率" class="headerlink" title="从不承诺100%的覆盖率"></a>从不承诺100%的覆盖率</h3><p>不要把话说满，这个中国人都很理解。不要保证太高的目标，给自己留点后路。</p>
<h3 id="倾听建议"><a href="#倾听建议" class="headerlink" title="倾听建议"></a>倾听建议</h3><p>别人的建议有些是金玉良言，有些则可以忽略不计。做测试的时候你不是一个人在战斗，多听听别的的有效建议是没有坏处的。</p>
<h3 id="尽早开始"><a href="#尽早开始" class="headerlink" title="尽早开始"></a>尽早开始</h3><p>尽早开始重要的模块的测试工作。因为问题发现的越早解决的成本就越低。另外早点开始测试重要的模块或功能可以尽可能多的增加测试时间，拿时间换质量一般来说是效果的。这个建议的另一个说法就是想办法让重要的模块可以尽早的开始测试。</p>
<h3 id="确定并管理风险"><a href="#确定并管理风险" class="headerlink" title="确定并管理风险"></a>确定并管理风险</h3><p>在做项目测试的时候，一个好的测试同学需要有发现项目质量上可能出现的风险的能力。另外当发现了项目风险的时候，我们还需要能够将风险管理起来，让风险可以被控制，可以被解决。</p>
<h3 id="做市场调研"><a href="#做市场调研" class="headerlink" title="做市场调研"></a>做市场调研</h3><p>看看友商的产品做的怎么样，有什么好的地方，有什么不好地方。好的地方我们的产品可以学习，不好的地方我们可以预防和改进。这是站在产品人员的角度去看待自己的项目或产品，因为好的测试在某些时候需要具备好的产品人员的素质。</p>
<h3 id="培养BA技能"><a href="#培养BA技能" class="headerlink" title="培养BA技能"></a>培养BA技能</h3><p>BA就是业务分析师的意思，在某些项目里，这类同学被称为产品狗。这要求测试人员有分析需求的能力，哪些需求是真需求，哪些需求是伪需求。真需求就玩命的测，伪需求在时间允许的情况下尽量的测。这也是产品视角，这也是为什么有很多测试同学转去做产品的原因。</p>
<h3 id="不要忘了异常情况"><a href="#不要忘了异常情况" class="headerlink" title="不要忘了异常情况"></a>不要忘了异常情况</h3><p>只测试正常的流程往往是不太够的，一些异常的情况我们也需要进行测试。另外不出意外的话异常情况的测试用例数量是要多于正常情况的。测试异常情况有助于我们发现bug，也有助于我们换个角度看待产品和项目的业务行为。</p>
<h3 id="Be-a-Good-Judge-of-Your-Product"><a href="#Be-a-Good-Judge-of-Your-Product" class="headerlink" title="Be a Good Judge of Your Product"></a>Be a Good Judge of Your Product</h3><p>做那个对项目/产品最有发言权的人。</p>
<h3 id="学会交涉"><a href="#学会交涉" class="headerlink" title="学会交涉"></a>学会交涉</h3><p>在保证项目质量的前提下我们要尽可能多的通过交涉和协商保障自己的利益。交涉意味着在某些情况下我们需要做出让步，退一步海阔天空，但前提是，退的这一步不影响项目或产品的质量。</p>
<h3 id="停止指责"><a href="#停止指责" class="headerlink" title="停止指责"></a>停止指责</h3><p>出问题的时候第一要务是先把问题解决掉，而不是指责相关责任人。</p>
<h3 id="做一个好的观察者"><a href="#做一个好的观察者" class="headerlink" title="做一个好的观察者"></a>做一个好的观察者</h3><p>观察项目，观察开发的流程，观察测试的流程，发现问题，提出问题，引导团队去解决问题。</p>
<h2 id="python-主要数据类型有哪些？"><a href="#python-主要数据类型有哪些？" class="headerlink" title="python 主要数据类型有哪些？"></a>python 主要数据类型有哪些？</h2><ul>
<li>数字：int、float、bool、complex</li>
<li>字符串：str</li>
<li>列表：list，用[]</li>
<li>元组：tuple，用()，就相当于不可修改的list</li>
<li>集合：set，用{}</li>
<li>字典：dict，用{key: value}</li>
</ul>
<h2 id="Linux-面试"><a href="#Linux-面试" class="headerlink" title="Linux 面试"></a>Linux 面试</h2><h3 id="你说一些-linux-命令，chmod-命令是干嘛的？怎么查看端口被占用？"><a href="#你说一些-linux-命令，chmod-命令是干嘛的？怎么查看端口被占用？" class="headerlink" title="你说一些 linux 命令，chmod 命令是干嘛的？怎么查看端口被占用？"></a>你说一些 linux 命令，chmod 命令是干嘛的？怎么查看端口被占用？</h3><ul>
<li><p>chmod 修改文件权限</p>
</li>
<li><p>查看某个进程的pid</p>
<pre><code>ps -ef | grep xxx(某个进程)
</code></pre>
</li>
<li><p>查找被占用的端口<br>```<br>netstat -tln<br>netstat -tln | grep 8083<br>netstat -lnp | grep 8083 </p>
</li>
</ul>
<pre><code>- 查看端口属于哪个程序？端口被哪个进程占用
</code></pre>
<p>  lsof -i :8083  </p>
<pre><code>- 杀掉占用端口的进程
</code></pre>
<p>kill -9 进程id</p>
<pre><code>
</code></pre>

            <hr>
          </div>
          <br>
          <div>
            <div id="post-tag">
              
                <span>
                  <i class="iconfont icon-inbox"></i>
                  
                    <a class="hover-with-bg" href="/categories/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95">软件测试</a>
                    &nbsp;
                  
                </span>
              
              <span>
                <i class="iconfont icon-tag"></i>
                
                  <a class="hover-with-bg" href="/tags/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95">软件测试</a>
                
              </span>
            </div>
            
              <div id="post-note">
                <div><strong>本文作者：</strong><a href="/alwaysblog/">张小剩</a></div>
                <div><strong>本文链接：</strong><a href="https://github.com/alwayscn/alwaysblog/post/2734300636/">https://github.com/alwayscn/alwaysblog/post/2734300636/</a></div>
                <div><strong>版权声明：</strong>本站文章除特别声明外，均采用 <a target="_blank" href="https://creativecommons.org/licenses/by-sa/3.0/deed.zh" rel="nofollow noopener noopener">CC BY-NC-SA 3.0 CN</a> 协议进行许可</div>
              </div>
            
            
              <div id="post-nav" class="container">
                  <div class="row">
                    
                      <a href="/alwaysblog/post/108766007/" id="post-nav-prev" class="col">
                        <i class="fas fa-arrow-left"></i>
                        <span class="post-nav-title">软件测试面试总结</span>
                      </a>
                    
                    
                      <a href="/alwaysblog/post/4261055596/" id="post-nav-next" class="col">
                        <span class="post-nav-title">软件测试理论</span>
                        <i class="fas fa-arrow-right"></i>
                      </a>
                    
                  </div>
                </div>
            
          </div>
        </div>

        <!-- custom -->
        

        <!-- Comments -->
        <div class="col-lg-10 mx-auto nopadding-md">
          <div class="comments mx-auto" id="comments">
            
             <br><br>
              
              
  <style type="text/css">
    .v[data-class=v] .vcontent > p > a:not(.at) {
      overflow-wrap: anywhere;
      display: inline;
    }
  </style>
  <div id="vcomments" style="margin: 0 auto;"></div>
  <script defer src="//cdn.jsdelivr.net/npm/@waline/client@latest/dist/Waline.min.js"></script>
<!--   <script defer src="//unpkg.zhimg.com/@waline/client@latest/dist/Waline.min.js"></script> -->
  <script>
    var notify = 'true' == true ? true : false;
    var verify = 'true' == true ? true : false;
    var oldLoad = window.onload;
    window.onload = function () {
      // 设置自定义文字
      const locale = {
        placeholder: "说点什么吧quq",
        uploading: "上传中...默认图床在境内可能无法访问"
      };
      Waline({
        el: '#vcomments',
        serverURL: "https://blog-waline-m0eiqctad-alwayscn.vercel.app/",
        avatar: "mp",
        avatarCDN: "https://gravatar.loli.net/avatar/",
        meta: ['nick', 'mail', 'link'],
        pageSize: "10",
        // 设置 emoji
        emoji: [
          'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/alus',
          'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo',
          'https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tieba',
        ],
        // 设置自定义文字
        locale,

        // 图片上传函数
         uploadImage: false
        // uploadImage: function (file) {
        // return smms(file)
        //         }
      });
      oldLoad && oldLoad();
      // smms 图床，Authorization 的位置为 smms 图床的 token（可选）
      function smms(file) {
        const formData = new FormData();
        formData.append('smfile', file);
        formData.append('format', 'json');
        let data = fetch('https://smms.pvq.workers.dev/upload', {
          method: 'POST',
          mode: 'cors',
          headers: new Headers({
            'Authorization': 'FNnpntzeJnw1SQc61jL6Tt1UZPzmhLBT'
          }),
          body: formData
        }).then(
          res => res.json()
        ).then(function(response) {
          const checkUrl = new RegExp('^[a-zA-z]+://[^\s]*');
          let url = response.code == 'image_repeated' ? response.images : (response.data.url ? response.data.url : '');
          // 若 smms 图床调用失败则转发请求到遇见图床
          return checkUrl.test(url) ? url : hualigs(file);
        }).catch(function(error) {
          // smms 图床调用失败，尝试遇见图床
          return hualigs(file);
        });
        return data;
      }
      // 遇见图床
      function hualigs(file){
        const formData = new FormData();
        formData.append('image', file);
        formData.append('privateStorage', 'backblaze');
        formData.append('apiType', 'catbox');
        formData.append('token', '146faa57355f01c8eed8a045eda6a684');
        return fetch('//www.hualigs.cn/api/upload', {
          method: 'POST',
          mode: 'cors',
          body: formData
        }).then(
          res => res.json()
        ).then(function(response) {
          const checkUrl = new RegExp('^[a-zA-z]+://[^\s]*');
          let backblaze = response.data.url.private.backblaze;
          let catbox = 'https://avatar.75cdn.workers.dev/?url=' + encodeURIComponent(response.data.url.catbox);
          return checkUrl.test(backblaze) ? backblaze : catbox
        });
      }
    };
  </script>
  <noscript>Please enable JavaScript to view the <a target="_blank" href="https://waline.js.org" rel="nofollow noopener noopener">comments
      powered by Waline.</a></noscript>


            
          </div>
        </div>

      </div>
    </div>
<!--     <div class="d-none d-lg-block col-lg-2 toc-container"> -->
    <div id="toc-container" class="d-none d-lg-block col-lg-2 ">
      
  <div id="toc">
    <p class="h4"><i class="far fa-list-alt"></i>&nbsp;目录</p>
    <div id="tocbot"></div>
    <div class="catalog-close" onclick="close_show(0)">关闭</div>
    <div id="post-catalog-bar" onclick="close_show(1)" class="post-catalog-bar-left-minborder" style="left: 144px;">
       <i class="far fa-book-open" style="font-size: 10px"></i> 目 录
    </div>
  </div>


    </div>
  </div>
</div>





    
  </main>
  
<div id="sidebar" class="sidebar-hide">
  <span class="sidebar-button sidebar-button-shift" id="toggle-sidebar" >
    <i class="fa fa-arrow-right on" aria-hidden="true"></i>
  </span>
  <div class="sidebar-overlay"></div>
  <div class="sidebar-intrude">
    <div class="sidebar-avatar">
      <img src="/alwaysblog/static/images/avatar.jpg" srcset="/alwaysblog/static/images/avatar.jpg" alt="avatar"/>
    </div>
    <div class="text-center sidebar-about">
      <p class="h3 sidebar-author">张小剩</p>
      <p class="sidebar-subtitle">One two one ... <script type='text/javascript'>console.log('博主认证: https://bbs.liyuans.com')</script></p>
      
        <a href="https://github.com/alwayscn" class="h4" target="_blank">
          <i class="fab fa-github" aria-hidden="true"></i>
        </a>
        &nbsp;&nbsp;
      
        <a href="https://www.yuque.com/extime/blog" class="h4" target="_blank">
          <i class="fab fa-twitter" aria-hidden="true"></i>
        </a>
        &nbsp;&nbsp;
      
        <a href="https://www.cnblogs.com/wehome" class="h4" target="_blank">
          <i class="fab fa-blog" aria-hidden="true"></i>
        </a>
        &nbsp;&nbsp;
      
        <a href="mailto:zhangxy.cn@gmail.com" class="h4" target="_blank">
          <i class="fas fa-envelope" aria-hidden="true"></i>
        </a>
        &nbsp;&nbsp;
      
    </div>
    <div class="sidebar-friend">
<!--       <p class="h6 sidebar-friend-title"> -->
<!--         <span class="sidebar-label-left"><i class="fas fa-user-friends"></i></span> -->
<!--         <span class="sidebar-label">友情链接</span> -->
<!--       </p> -->
      <ul class="list-group">
        
          <a href="https://console.leancloud.app/" target="_blank">
            <li class="list-group-item">
              <i class="fas fa-quote-left"></i>&nbsp;
              LeanCloud
            </li>
          </a>
        
          <a href="https://vercel.com/" target="_blank">
            <li class="list-group-item">
              <i class="fas fa-quote-left"></i>&nbsp;
              Vercel
            </li>
          </a>
        
          <a href="https://hitokoto.cn/" target="_blank">
            <li class="list-group-item">
              <i class="fas fa-quote-left"></i>&nbsp;
              一言
            </li>
          </a>
        
          <a href="https://zty.pe/" target="_blank">
            <li class="list-group-item">
              <i class="fas fa-quote-left"></i>&nbsp;
              打字游戏
            </li>
          </a>
        
          <a href="https://flipanim.com/" target="_blank">
            <li class="list-group-item">
              <i class="fas fa-quote-left"></i>&nbsp;
              在线涂鸦
            </li>
          </a>
        
          <a href="http://gogoame.sumbioun.com/" target="_blank">
            <li class="list-group-item">
              <i class="fas fa-quote-left"></i>&nbsp;
              Gogoame (午後雨)
            </li>
          </a>
        
          <a href="https://hin.cool/c/dd.html" target="_blank">
            <li class="list-group-item">
              <i class="fas fa-quote-left"></i>&nbsp;
              减压滑碟
            </li>
          </a>
        
          <a href="https://www.jq22.com/yanshi4710" target="_blank">
            <li class="list-group-item">
              <i class="fas fa-quote-left"></i>&nbsp;
              元素周期
            </li>
          </a>
        
    </ul>
    </div>
  </div>
</div>


  
    <a class="z-depth-1" id="scroll-top-button" href="#" role="button">
      <i class="fa fa-chevron-up scroll-top-arrow" aria-hidden="true"></i>
    </a>
  
  
    <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
  
  <div id="footerContent"  class="rgba-black-slight">
<footer>
  <div class="footer-plane">
      <div class="blog_music">
        <script src="//music.clwl.online/Player/player.min.js" id="SinKingMusic" key="765"></script>
      </div>
      <div class="footer-container">

        <div class="footer-left">
            <div>
            <!-- 版权信息 -->
            
            <div class="footer-info">
                
                  Copyright © 2023&nbsp;张小剩.Powered by
                 <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener noreferrer">
                  Fluid
                 </a>
                
            </div>
            
            <!-- 备案信息 -->
            
            </div>

        </div>
        <div class="footer-details footer-right">
            <div>
                
                <div class="footer-aside-box">
                    <i class="fa fa-cog fa-spin"></i>
                    <span id="span">本站已稳定运行: 128天11小时56分5秒</span>
                    <script type="text/javascript">
                        function runtime() {
                            // 初始时间，日/月/年 时:分:秒
                            // X = new Date("09/27/2021 07:21:00");
                            console.log("12/12/2021 07:21:00")
                            X = new Date("12/12/2021 07:21:00");
                            Y = new Date();
                            T = (Y.getTime() - X.getTime());
                            M = 24 * 60 * 60 * 1000;
                            a = T / M;
                            A = Math.floor(a);
                            b = (a - A) * 24;
                            B = Math.floor(b);
                            c = (b - B) * 60;
                            C = Math.floor((b - B) * 60);
                            D = Math.floor((c - C) * 60);
                            //信息写入到DIV中
                            span.innerHTML = "本站已稳定运行: " + A + " 天" + B + " 小时" + C + " 分" + D
                             + " 秒"
                        }

                        setInterval(runtime, 1000);
                    </script>
                </div>
                

                
            </div>
      </div>
      </div>
      <!-- 一言 -->
      
          <div class="footer-hitokoto">
            <a id="hitokotoa" href="#" target="_blank" rel="nofollow noopener noreferrer">
              <span id="hitokoto"></span>
            </a>
          </div>
      
  </div>
</footer>
</div>
<!-- SCRIPTS -->
<script src="/alwaysblog/lib/popper/popper.min.js" ></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js" ></script>
<script src="https://cdn.staticfile.org/mdbootstrap/4.8.7/js/mdb.min.js" ></script>
<script src="/alwaysblog/js/main.js" ></script>

  <script src="/alwaysblog/js/lazyload.js" ></script>


  
    <script src="https://cdn.staticfile.org/tocbot/4.8.1/tocbot.min.js" ></script>
  
  <script src="/alwaysblog/js/post.js" ></script>

<!-- Plugins -->

  <script src="/alwaysblog/lib/prettify/prettify.min.js" ></script>
  <script type="text/javascript">
    $(document).ready(function () {
      $('pre').addClass('prettyprint  linenums');
      prettyPrint();
    })
  </script>


  <script src="https://cdn.staticfile.org/typed.js/2.0.9/typed.min.js" ></script>
  <script type="text/javascript">
    var typed = new Typed('#subtitle', {
      strings: [
        '  ',
        "软件测试面试&nbsp;",
      ],
      cursorChar: "_",
      typeSpeed: 70,
      loop: false,
    });
    typed.stop();
    $(document).ready(function () {
      $(".typed-cursor").addClass("h2");
      typed.start();
    });
  </script>


  <script src="https://cdn.staticfile.org/anchor-js/4.2.0/anchor.min.js" ></script>
  <script type="text/javascript">
    anchors.options = {
      placement: "right",
      visible: "hover",
      
    };
    var el = "h1,h2,h3,h4,h5,h6".split(",");
    var res = [];
    for (item of el) {
      res.push(".markdown-body > " + item)
    }
    anchors.add(res.join(", "))
  </script>


  <script src="/alwaysblog/js/local-search.js" ></script>
  <script type="text/javascript">
    var path = "/alwaysblog/local-search.xml";
    var inputArea = document.querySelector("#local-search-input");
    inputArea.onclick = function () {
      getSearchFile(path);
      this.onclick = null
    }
  </script>


  <script src="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.js" ></script>
  <script type="text/javascript">
  /* Fancybox */
  var setupFancybox = function () {
    $("#post img:not(.no-zoom img, img[no-zoom])").each(function() {
    var element = document.createElement("a");
      $(element).attr("data-fancybox", "gallery");
      $(element).attr("href", $(this).attr("src"));
      $(this).wrap(element);
    });
  };
  setupFancybox();
  </script>


  

  
    <!-- MathJax -->
    <script type="text/x-mathjax-config">
      MathJax.Hub.Config({
          tex2jax: {
              inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
              processEscapes: true,
              skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
          }
      });

      MathJax.Hub.Queue(function() {
          var all = MathJax.Hub.getAllJax(), i;
          for(i=0; i < all.length; i += 1) {
              all[i].SourceElement().parentNode.className += ' has-jax';
          }
      });

    </script>

    <script src="https://cdn.staticfile.org/mathjax/2.7.6/MathJax.js?config=TeX-MML-AM_CHTML" ></script>

  





  <script type="text/javascript">
  /*一言API*/
  $(document).ready(function(){getHitokoto();});
  function hitokoto(e) {
    $("#hitokoto").stop().fadeOut(function() {
      $("#hitokoto").html(e.hitokoto);
      var element = document.getElementById('hitokotoa');
      element.href = "https://hitokoto.cn/?uuid=" + e.uuid;
      $("#hitokoto").stop().fadeIn();
    })
  };
  function getHitokoto() {
    var e = ["a", "b", "c", "d", "e", "i"];
    fetch('https://v1.hitokoto.cn/?encode=json&charset=utf-8&c=' + e[Math.floor(Math.random() * e.length)], {cache: 'no-cache', method: 'GET', mode: 'cors'}).then(response => response.json()).then(data => {
      hitokoto(data);
      setTimeout(getHitokoto, 1e4);
    }).catch(console.error)
  };
  </script>




<!-- Functions -->
<script type="text/javascript">
  /* 切换背景 */
  
  $("#background").removeClass("banner-bg");
  $("body").addClass("banner-bg");
  var postToTopHight = $("#board").offset().top;
  $(window).scroll(function () {
    var bgDisplay = false;
    var scrollHeight = document.body.scrollTop + document.documentElement.scrollTop;
    bgDisplay = scrollHeight >= postToTopHight;
    if(bgDisplay) {
      $('#background').removeClass("rgba-black-slight");
      $('#mainContent').removeClass("rgba-black-slight");
      $('#footerContent').removeClass("rgba-black-slight");
    } else {
      $('#background').addClass("rgba-black-slight");
      $('#mainContent').addClass("rgba-black-slight");
      $('#footerContent').addClass("rgba-black-slight");
    }
  });
  
</script>

  <script type="text/javascript">
    /*显示博客运行时间*/
    var blogRunTime = function () {
      var runTime = document.getElementById("runtime");
      var runtimeDate = "12/12/2021 07:21:00";
	    var createDate = new Date(runtimeDate);
	    var nowDate = new Date();
	    var dateLine = nowDate.getTime() - createDate.getTime();
	    var runDate = Math.floor(dateLine / (1000 * 60 * 60 * 24));
	    runTime.innerHTML = runDate;
    };
    $(document).ready(function(){
	    blogRunTime();
    });
  </script>


  <script type="text/javascript">
    /*窗口监视*/
    var originalTitle = document.title;
    window.onblur = function(){document.title = "你不爱我了QAQ"};
    window.onfocus = function(){document.title = originalTitle};
  </script>


  <script type="text/javascript">
    /* 雪花效果 */
    console.log('雪花效果 code by kvv.me');
    ~function () {
      function t() {
          e.width = window.innerWidth,
          e.height = window.innerHeight,
          o = Math.round(window.innerWidth * window.innerHeight / 1e4)
      }
      function n() {
          var t = window.innerWidth
            , d = window.innerHeight
            , c = e.getContext("2d");
          c.clearRect(0, 0, t, d),
          c.fillStyle = "rgba(255, 255, 255, 0.7)",
          c.beginPath(),
          a += .01;
          for (var u = 0; o > u; u++) {
            var l = r[u];
            if (!l) {
              continue
            }
            ;c.moveTo(l.x, l.y),
            c.arc(l.x, l.y, l.radius, 0, 2 * Math.PI, !0),
            l.y += Math.cos(a) + l.radius / 2,
            l.x += Math.sin(a * l.direction),
            (l.x > t + 5 || -5 > l.x || l.y > d) && (u % 3 > 0 ? (r[u].x = Math.random() * t,
            r[u].y = -10) : Math.sin(a * l.direction) > 0 ? (r[u].x = -5,
            r[u].y = Math.random() * d) : (r[u].x = t + 5,
            r[u].y = Math.random() * d))
          }
          c.fill(),
          i(n)
      }
      var e = document.createElement("canvas")
        , i = requestAnimationFrame || msRequestAnimationFrame || function(t) {
          setTimeout(t, 16)
        }
      , a = 0
      , o = 0
      , r = [];
      t(),
      e.className = "snow",
      document.body.appendChild(e);
      for (var d = 0; o > d; d++)
        r.push({
            x: Math.random() * window.innerWidth,
            y: Math.random() * window.innerHeight,
            radius: 4 * Math.random() + 1,
            direction: 2 * Math.random() - .5
        });
      addEventListener("resize", t),
      i(n)
    }();
  </script>


  <script type="text/javascript">
    /* 评论自动跳转 */
    var jumpComments = function(){
      if(window.location.hash){
        var hash_decode = decodeURI(window.location.hash);
        if(!$(hash_decode).length){
          var checkExist = setInterval(function() {
            if ($(hash_decode).length) {
              clearInterval(checkExist);
              setTimeout(function(){
                $('html, body').animate({scrollTop: $(hash_decode).offset().top-90}, 1000);
              }, 1500);
            }
          }, 100);
        }
      }
    }
    $(document).ready(function(){
	    jumpComments();
    });
  </script>

 
 
 
 

<!-- cnzz -->
<style type="text/css">#cnzz_stat_icon_1258664352{display: none;}</style>
<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1258664352'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/z_stat.php%3Fid%3D1258664352' type='text/javascript'%3E%3C/script%3E"));</script>
 

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-150991779-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag("js", new Date());
  gtag("config", "UA-150991779-1");
</script>
 

  
</body>
</html>